//
//  CZLoginViewController.swift
//  Weibo24
//
//  Created by apple on 16/2/26.
//  Copyright © 2016年 apple. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD

/*
    第一个问题: 成为微博的开发者
        1.去: open.weibo.com 完善开发者信息
        2.微连接,选择移动应用,创建一个app应用
        3.完善应用信息 -- 高级信息(回调网页) /测试信息(添加测试的账号)
        4.纪录一些应用信息 --
    第二个问题: Token -- Oauth认证
        1. 第一个接口文档 -- 能够获取的数据就是一个 code , 用于调用access_token，接口获取授权后的access token
        2. 第二个接口文档 -- 

        第一步: App提供一个网页(网页内容是由服务器提供的)
        https://api.weibo.com/oauth2/authorize?client_id=1016883931&redirect_uri=http://www.itcast.cn&response_type=code
        //重定向的URL是作为一个成功的回调,此外还有提示作用(提示开发者你已经获取到code了)
    //1016883931
    //http://www.itcast.cn
        第二步: 我们可以在网页里输入用户名和密码
        第三步: 服务器会验证用户名和密码,然后返回网页一个 Code

        http://www.itcast.cn/?code=b38d2c2cb6d9dddc47d752d9e53014dc

        第四步: App通过一定的方式来获取Code
        
        1.通过截取
        2.

        第五步: App通过这个Code来向服务器请求换取Token



        第六步: 服务器验证一下Code,然后返回给App,Token


        第七步: App可以通过Token来获取授权用户的数据

*/
/*
    什么是Token

    1.从服务器上获取数据,需要一定的权限,
    2.权限从哪里来? -- 登陆之后,就有权限了!
    3.
*/

/*
    想拿到这个  http://www.itcast.cn/?code=b38d2c2cb6d9dddc47d752d9e53014dc
这个网址,怎么拿到?
    1.对UIWebView做文章
    2. UIWebView的代理方法 -> 设置代理,遵循协议,实现方法
    3.怎么才能通过代理方法获取到 http://www.itcast.cn/?code=b38d2c2cb6d9dddc47d752d9e53014dc
*/

class CZLoginViewController: UIViewController ,UIWebViewDelegate{

    
    // 创建一个网页变量 -- 网页填充整个视图
    var webView: UIWebView?
    
    // 为什么不调用父类? -- loadView的作用? -- 创建一个视图,
    override func loadView() {
        
        //一定要注意,创建实例
        webView = UIWebView()
        //设置代理
        webView?.delegate = self
        //赋值
        view = webView
        
        print(view)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.whiteColor()
        
        setupNav()
        
        //设置请求url
        let url = NSURL(string: "https://api.weibo.com/oauth2/authorize?client_id=\(App_KEY)&redirect_uri=\(App_URL)&response_type=code")!
        //创建一个请求
        let request = NSURLRequest(URL: url)
        // 加载请求
        webView?.loadRequest(request)
    }


    
    
    private func setupNav(){
    
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "返回", style: UIBarButtonItemStyle.Plain, target: self, action: "dismiss")
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "自动填充", style: .Plain, target: self, action: "auto")
        
    }
    
    //MARK:--实现nav的按钮方法
   private func dismiss(){
    
        dismissViewControllerAnimated(true) { () -> Void in
            
        }
        
    }
    //private 私有的修饰符 -- 不能添加到button等点击事件方法里,因为不能被访问
    // 想让程序在运行的时候呢,找到私有方法,需要用到OC里的运行时,给私有修饰符前边加一个关键字 @objc
    @objc  private func auto(){
        //
        let js = "document.getElementById(\"userId\").value = \"itcast123456@hotmail.com\";document.getElementById(\"passwd\").value = \"itcast123456\";"
        //注入到web页面
        
        webView?.stringByEvaluatingJavaScriptFromString(js)
    }
}


//把WebView的代理方法写在这里
extension CZLoginViewController{

    // webView开始加载的方法
    func webViewDidStartLoad(webView: UIWebView) {
        /*
            1. show()就是一个默认的加载提示
            2. showErrorWithStatus("error")显示错误信息
        */
        SVProgressHUD.show()
        
    }
    // web完成加载的方法
    func webViewDidFinishLoad(webView: UIWebView) {
        //dismiss() 消失的方法
        SVProgressHUD.dismiss()
    }
    // 失败的方法
    func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
        SVProgressHUD.dismiss()
    }
    // 重点 是这个方法
    /*
        这个方法--只要我们加载网页的URL,都会走这个方法,默认返回 true
    
    */
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        

        //先判空
        if let url = request.URL?.absoluteString{
            // 前缀 -- url.hasPrefix(<#T##prefix: String##String#>)
            // 后缀 -- url.hasSuffix(<#T##suffix: String##String#>)
            
            if url.hasPrefix(App_URL){

                // http://www.itcast.cn/?code=50ad2019f300c02679e0b2d19e18ba90
                if let code = request.URL?.query {
                
                    print(code)
                    
                    //可以再取截取
                    // code=50ad2019f300c02679e0b2d19e18ba90
                    //substringFromIndex->子字符串从 哪里开始 -> 从"code="之后返回那个子字符串
                    let subCode = code.substringFromIndex("code=".endIndex)
                    
                    print(subCode)
                    //获取Token方法
                    //这个方法调用的,我们想让 这个方法全权负责
                    
                    
                    
                    CZUserViewModel().loadToken(subCode, success: { () -> () in
                        //成功的回调
                        print("成功")
                        
                        /*
                            处理方法
                            1.不能显示回调页面
                            2.授权成功之后,应该返回到首页
                        */
                        
                        /*
                            页面消失的时候,改变根控制器
                            改keyWindow,不建议这么做 
                        
                        */
                        
                        NSNotificationCenter.defaultCenter().postNotificationName(kNotificaionChangeRootVC, object: nil)
                        
                        self.dismissViewControllerAnimated(true, completion: { () -> Void in
                            
                        })
                        
                        }, failure: { () -> () in
                            //失败的回调
                            print("失败")
                            
                    })
                    
                    //返回一个false的话, 下边的RUL页面就不加载
                    return false
    
                }
                

                
            }
        }
        
        
        return true
        
    }
}

//MARK:--通过code来换取Token
extension CZLoginViewController{


    
}

//MARK:--通过Toekn来获取用户信息
extension CZLoginViewController{

    
}